#include <iostream>
using namespace std;

const int N = 110; //行列最多50，这里开110主要是k可以达到100，如果此时i=1的时候，j会等到99，所以不能只开50
const int dx[4] = {0, 0, 1, 1};
const int dy[4] = {0, 1, 0, 1}; //还是左左，左上，上左，上上

int n, m;
int a[N][N];
int f[N][N][N];

int main()
{
    freopen("cin.txt", "r", stdin);
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            cin >> a[i][j];
    for (int k = 2; k <= n + m; ++k)
        for (int i_1 = 1; i_1 < k; ++i_1)
            for (int i_2 = 1; i_2 < k; ++i_2)
                if (i_1 == i_2 && k != 2 && k != n + m) //如果路径上遇到了重复走法,不在起点或者到达目的地
                    f[k][i_1][i_2] = -1;                //只要置为-1，那么其他的正常路径走过来的绝对比他大，相当于判了死刑
                else                                    //不然就正确迭代呗
                    for (int i = 0; i < 4; ++i)
                        f[k][i_1][i_2] = max(f[k][i_1][i_2], f[k - 1][i_1 - dx[i]][i_2 - dy[i]] + a[i_1][k - i_1] + a[i_2][k - i_2]);
    cout << f[n + m][n][n];
    return 0;
}